<?php

/*
 * +----------------------------------------------------------------------
 * 作 者: xinglou <xinglou1@foxmail.com>
 * +----------------------------------------------------------------------
 * 创建日期：2015-06-24
 * ------------------------------------------------------------------------
 * 文件描述：角色管理
 * ------------------------------------------------------------------------
 * 升级记录：
 * ------------------------------------------------------------------------
 */
class RoleAction extends CommonAction
{

    /**
     * 查询角色信息
     */
    public function index()
    {
        $model = new RoleModel();
        
        // 条件检索
        if (! empty($_REQUEST['search_keyword'])) {
            $where['id|name|intro'] = array(
                'like',
                '%' . $this->_request('search_keyword') . '%'
            );
        }
        
        // 分页处理
        import('ORG.Util.Page'); // 导入分页类
        $count = $model->where($where)->count(); // 查询满足要求的总记录数
        $p = $this->_page($model, 'seq'); // 分页所需信息
        $page = new Page($count, $p['listRows']); // 实例化分页类 传入总记录数和每页显示的记录数
        $data = $model->field("id,
 								name,
 								intro,
 								get_field_dict_name('user', 'status', status) status,
 								get_user_name(operator) operator,
 							 	update_date")
            ->where($where)
            ->order("`" . $p['order'] . "` " . $p['sort'])
            ->limit($page->firstRow . ', ' . $page->listRows)
            ->select();
        $this->assign('data', $data);
        $show = $page->show(); // 分页显示输出
        $this->assign('show', $show); // 绑定分页显示字符串
        $this->display();
    }

    /**
     * 显示角色添加页面
     */
    public function add()
    {
        $this->assign('status_list', set_field_dict_list('role', 'status'));
        $this->display();
    }

    /**
     * 将角色提交的数据添加到数据库
     */
    public function insert()
    {
        $model = new RoleModel();
        $data = $model->create();
        if (false !== $data) {
            $data = $model->add();
            if (false !== $data) {
                redirect(__APP__ . '?g=Admin&m=Role&a=index');
            } else {
                $this->error('角色添加失败');
            }
        } else {
            $this->error('添加失败' . $model->getError());
        }
    }

    /**
     * 显示角色修改页面
     */
    public function edit()
    {
        $id = $this->_request('id');
        $model = new RoleModel();
        $data = $model->where("id = '" . $id . "'")->find();
        $this->assign('data', $data);
        $this->assign('status_list', set_field_dict_list('role', 'status'));
        $this->display();
    }

    /**
     * 将数据修改的数据提交到数据库
     */
    public function update()
    {
        $model = new RoleModel();
        
        // 创建对象
        $data = $model->create();
        if (false !== $data) {
            if (empty($data['type'])) {
                $data['type'] = 'a';
            }
            $data = $model->save($data);
            if (false !== $data) {
                redirect(__APP__ . '?g=Admin&m=Role&a=index');
            } else {
                $this->error('角色修改失败！');
            }
        } else {
            $this->error('角色修改失败！' . $model->getError());
        }
    }

    /**
     * 显示角色删除界面
     */
    public function delete()
    {
        $deleteId = $this->_request('ids');
        if (! empty($deleteId) && is_array($deleteId)) {
            $model = new RoleModel();
            $id = implode("','", $deleteId); // 用','分割id数组，以便于拼装sql语句
            $id = "'" . $id . "'"; // 拼装sql语句，结果为'firstId','secondId',…
            if (false !== $model->where("id in(" . $id . ")")->delete()) {
                redirect($_SERVER['HTTP_REFERER']);
            } else {
                $this->error('角色删除失败！');
            }
        } else {
            $this->error('您未选中任何记录！');
        }
    }

    /**
     * 查询当前角色已授权的页面
     */
    public function select_page()
    {
        // 角色编号
        $roleid = $this->_request('roleid');
        $this->assign('roleid', $roleid); // 未处理之前重新绑定，需传递到下一个提交的地址
                                          
        // 查询当前角色已授权的页面
        $model = new RolePageModel();
        $data = $model->where("roleid = '" . $roleid . "'")->getField('pageid', true);
        $this->assign('pageIds', implode(',', $data)); // 将页面编号数组用逗号分割成字符串并绑定到前台
                                                       
        // 查询页面列表
        $page = new PageModel();
        $list = $page->field("id,
								parentid,
								name")
            ->where("parentid = '0'
					 	  and status = 'a'")
            ->order('seq')
            ->select();
        foreach ($list as $key => $value) {
            $list[$key]['sub_list'] = $page->field("id,
													parentid,
													name")
                ->where("parentid = '" . $value['id'] . "'
										   		and status = 'a'")
                ->order('seq')
                ->select();
        }
        $this->assign('list', $list);
        $this->display();
    }

    /**
     * 批量为用户设置角色
     */
    public function set_role_page()
    {
        $roleid = $this->_request('roleid');
        $pageIds = $this->_request('pageid');
        $model = new RolePageModel();
        $model->startTrans(); // 启动事务
                              
        // 删掉当前角色的历史授权信息
        if (false === $model->where("roleid = '" . $roleid . "'")->delete()) {
            $model->rollback(); // 回滚事务
            $this->success('历史授权信息删除失败！');
        }
        foreach ($pageIds as $value) {
            $add_data['roleid'] = $roleid;
            $add_data['pageid'] = $value;
            
            // 将页面授权信息添加至数据库
            $data = $model->create($add_data, 1);
            if (false !== $data) {
                if (false === $model->add()) {
                    $model->rollback(); // 回滚事务
                    $this->error('角色授权失败！');
                }
            } else {
                $model->rollback(); // 回滚事务
                $this->error('角色授权失败！' . $model->getError());
            }
            // 如果自动添加
        }
        $model->commit(); // 提交事务
        $this->success('角色授权成功！');
    }

    /**
     * 通过Validform框架实时验证【角色编号】的唯一性
     * ajaxurl指定的文件可以接收到Post过来的两个值，分别是param和name，param是该元素的值，name是该元素的name名称。可以通过区别name来把一个表单下，多个实时验证请求，都指定到同一个文件。
     */
    public function check_roleid()
    {
        $model = new RoleModel();
        $roleid = $model->where("id = '" . $this->_request('param') . "'")
            ->getField('id');
        
        // 若数据库中该角色编号不存在，则该角色编号可以使用
        if (empty($roleid)) {
            echo 'y'; // Validform实时验证成功时只能输出'y'，其它任何字符将作为验证失败提示信息返回
        } else {
            echo '角色编号已经存在，请选择其他！';
        }
    }
}
?>